﻿/**
 * Create in 2012-3-30.
 */
package kit4j.view.cs.awt.image.drawer;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;

/**
 * 
 * @author MiniKnife
 * 
 */
public abstract class AbstractDrawer implements IDrawer {

	/**
	 * @see kit4j.view.cs.awt.image.drawer.IDrawer#draw(java.awt.Image)
	 */
	@Override
	public Image draw(Image img) {
		Graphics g = getGraphics(img);

		Image result = doDraw(img, g);

		return result;
	}

	/**
	 * 返回指定Image对象的进行绘制的Graphics上下文对象。
	 * 
	 * @param img
	 *            要进行绘制的Image对象
	 * @return 绘制的Graphics上下文对象
	 */
	protected Graphics getGraphics(Image img) {
		Graphics g = img.getGraphics();
		Color nextColor = nextColor(g);
		Font nextFont = nextFont(g);
		Color nextXORColor = nextXORColor(g);

		if (nextColor != null) {
			g.setColor(nextColor);
		}
		if (nextFont != null) {
			g.setFont(nextFont);
		}
		if (nextXORColor != null) {
			g.setXORMode(nextXORColor);
		}
		if (isPaintMode(g)) {
			g.setPaintMode();
		}

		return g;
	}

	/**
	 * @param g
	 *            要进行绘制的Graphics上下文
	 * @return 下一个要绘制的Graphics上下文的颜色。
	 * @see java.awt.Graphics#setColor(Color)
	 */
	abstract protected Color nextColor(Graphics g);

	/**
	 * @param g
	 *            要进行绘制的Graphics上下文
	 * @return 下一个要绘制的Graphics上下文的字体。
	 * @see java.awt.Graphics#setFont(Font)
	 */
	abstract protected Font nextFont(Graphics g);

	/**
	 * @param g
	 *            要进行绘制的Graphics上下文
	 * @return 下一个要绘制的Graphics上下文的XOR绘图模式颜色，如果不要设置，则返回null。
	 * @see java.awt.Graphics#setXORMode(Color)
	 */
	abstract protected Color nextXORColor(Graphics g);

	/**
	 * @param g
	 *            要进行绘制的Graphics上下文
	 * @return 如果要将Graphics上下文设置为绘图模式，返回true，否则返回false。
	 * @see java.awt.Graphics#setPaintMode()
	 */
	protected boolean isPaintMode(Graphics g) {
		return false;
	}

	/**
	 * 针对指定的图像在指定的Graphics上下文中进行绘制操作。
	 * 
	 * @param img
	 *            要进行绘制的图像
	 * @param g
	 *            进行绘制操作的Graphics上下文
	 * @return 绘制完成后的图像
	 */
	abstract protected Image doDraw(Image img, Graphics g);

}
